package javaCode.chapter16.threaduse;

/**
 * @author 徐州城
 * @version 1.0
 * 演示通过继承Thread 类创建线程
 * 1. 请编写长须，开启一个线程，该线程每隔1秒。在控制台输出 "喵喵，我是小猫咪"
 * 2. 对上题改进：当输出80此 喵喵，我是小猫咪，结束该线程
 * 3. 使用JConsole 监控线程执行情况，并画出程序示意图!
 */
public class Thread01 {
    public static void main(String[] args) throws InterruptedException{

        //创建Cat对象，可以当作线程来使用
        Cat cat = new Cat();

        //解读源码
        /*
            (1)
            public synchronized void start() {
                start0();
            }
            (2)
            //start0 是本地方法，是JVM调用，底层是 c/c++实现
            //真正实现多线程的效果，是start0()，而不是 run
            private native void start0();
         */
        cat.start();//启动线程 -> 最终会执行cat的run()


        //cat.run();//run()就是一个普通的方法，没有真正的启动一个线程，就会把run方法执行完毕，才会往下执行
        //说明：当main线程启动一个子线程 Thread-0，主线程不会阻塞，会继续执行
        //这时主线程 和子线程是交替执行...

        System.out.println("主线程继续执行" + Thread.currentThread().getName());//main
        for (int i = 0; i < 60; i++) {
            System.out.println("main线程执行中 i=" + i);
            //让主线程休眠
            Thread.sleep(1000);
        }
    }
}

//解读
//1. 当一个类继承了 Thread类，该类就可以当作线程来使用
//2. 我们会重写run 方法，写上自己的业务代码
//3. run Thread 类 实现了 Runnable 接口的run方法
/*
    @Override
    public void run() {
        if (target != null) {
            target.run();
        }
    }
 */
class Cat extends Thread{

    @Override
    public void run() {

        int times = 0;

        while (true) {
            //该线程每隔1秒，在控制台输出 "喵喵，我是小猫咪"
            System.out.println("喵喵，我是小猫咪" + (++times) + " 线程名=" + Thread.currentThread().getName());
            //让该线程休眠1秒 ctrl + alt  + t
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            if (times == 60)
                break;
        }
    }
}
